// Licensed to Elasticsearch B.V under one or more agreements.
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information.
//
// ███╗   ██╗ ██████╗ ████████╗██╗ ██████╗███████╗
// ████╗  ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝
// ██╔██╗ ██║██║   ██║   ██║   ██║██║     █████╗
// ██║╚██╗██║██║   ██║   ██║   ██║██║     ██╔══╝
// ██║ ╚████║╚██████╔╝   ██║   ██║╚██████╗███████╗
// ╚═╝  ╚═══╝ ╚═════╝    ╚═╝   ╚═╝ ╚═════╝╚══════╝
// ------------------------------------------------
//
// This file is automatically generated.
// Please do not edit these files manually.
//
// ------------------------------------------------

using Elastic.Transport;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text.Json;
using System.Text.Json.Serialization;

#nullable restore
namespace Elastic.Clients.Elasticsearch.Mapping
{
	public partial class Properties : IsADictionaryBase<PropertyName, IProperty>
	{
		public Properties()
		{
		}

		public Properties(IDictionary<PropertyName, IProperty> container) : base(container)
		{
		}

		public void Add(string name, IProperty property) => BackingDictionary.Add(name, property);
	}

	public sealed partial class PropertiesDescriptor<TDocument> : IsADictionaryDescriptor<PropertiesDescriptor<TDocument>, Properties, PropertyName, IProperty>
	{
		public PropertiesDescriptor() : base(new Properties())
		{
		}

		public PropertiesDescriptor(Properties properties) : base(properties ?? new Properties())
		{
		}

		public PropertiesDescriptor<TDocument> AggregateMetricDouble(PropertyName propertyName) => AssignVariant<AggregateMetricDoublePropertyDescriptor<TDocument>, AggregateMetricDoubleProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> AggregateMetricDouble(PropertyName propertyName, Action<AggregateMetricDoublePropertyDescriptor<TDocument>> configure) => AssignVariant<AggregateMetricDoublePropertyDescriptor<TDocument>, AggregateMetricDoubleProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> AggregateMetricDouble(PropertyName propertyName, AggregateMetricDoubleProperty aggregateMetricDoubleProperty) => AssignVariant(propertyName, aggregateMetricDoubleProperty);
		public PropertiesDescriptor<TDocument> AggregateMetricDouble(Expression<Func<TDocument, object>> propertyName) => AssignVariant<AggregateMetricDoublePropertyDescriptor<TDocument>, AggregateMetricDoubleProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> AggregateMetricDouble(Expression<Func<TDocument, object>> propertyName, Action<AggregateMetricDoublePropertyDescriptor<TDocument>> configure) => AssignVariant<AggregateMetricDoublePropertyDescriptor<TDocument>, AggregateMetricDoubleProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Binary(PropertyName propertyName) => AssignVariant<BinaryPropertyDescriptor<TDocument>, BinaryProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Binary(PropertyName propertyName, Action<BinaryPropertyDescriptor<TDocument>> configure) => AssignVariant<BinaryPropertyDescriptor<TDocument>, BinaryProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Binary(PropertyName propertyName, BinaryProperty binaryProperty) => AssignVariant(propertyName, binaryProperty);
		public PropertiesDescriptor<TDocument> Binary(Expression<Func<TDocument, object>> propertyName) => AssignVariant<BinaryPropertyDescriptor<TDocument>, BinaryProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Binary(Expression<Func<TDocument, object>> propertyName, Action<BinaryPropertyDescriptor<TDocument>> configure) => AssignVariant<BinaryPropertyDescriptor<TDocument>, BinaryProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Boolean(PropertyName propertyName) => AssignVariant<BooleanPropertyDescriptor<TDocument>, BooleanProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Boolean(PropertyName propertyName, Action<BooleanPropertyDescriptor<TDocument>> configure) => AssignVariant<BooleanPropertyDescriptor<TDocument>, BooleanProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Boolean(PropertyName propertyName, BooleanProperty booleanProperty) => AssignVariant(propertyName, booleanProperty);
		public PropertiesDescriptor<TDocument> Boolean(Expression<Func<TDocument, object>> propertyName) => AssignVariant<BooleanPropertyDescriptor<TDocument>, BooleanProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Boolean(Expression<Func<TDocument, object>> propertyName, Action<BooleanPropertyDescriptor<TDocument>> configure) => AssignVariant<BooleanPropertyDescriptor<TDocument>, BooleanProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> ByteNumber(PropertyName propertyName) => AssignVariant<ByteNumberPropertyDescriptor<TDocument>, ByteNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> ByteNumber(PropertyName propertyName, Action<ByteNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<ByteNumberPropertyDescriptor<TDocument>, ByteNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> ByteNumber(PropertyName propertyName, ByteNumberProperty byteNumberProperty) => AssignVariant(propertyName, byteNumberProperty);
		public PropertiesDescriptor<TDocument> ByteNumber(Expression<Func<TDocument, object>> propertyName) => AssignVariant<ByteNumberPropertyDescriptor<TDocument>, ByteNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> ByteNumber(Expression<Func<TDocument, object>> propertyName, Action<ByteNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<ByteNumberPropertyDescriptor<TDocument>, ByteNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Completion(PropertyName propertyName) => AssignVariant<CompletionPropertyDescriptor<TDocument>, CompletionProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Completion(PropertyName propertyName, Action<CompletionPropertyDescriptor<TDocument>> configure) => AssignVariant<CompletionPropertyDescriptor<TDocument>, CompletionProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Completion(PropertyName propertyName, CompletionProperty completionProperty) => AssignVariant(propertyName, completionProperty);
		public PropertiesDescriptor<TDocument> Completion(Expression<Func<TDocument, object>> propertyName) => AssignVariant<CompletionPropertyDescriptor<TDocument>, CompletionProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Completion(Expression<Func<TDocument, object>> propertyName, Action<CompletionPropertyDescriptor<TDocument>> configure) => AssignVariant<CompletionPropertyDescriptor<TDocument>, CompletionProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> ConstantKeyword(PropertyName propertyName) => AssignVariant<ConstantKeywordPropertyDescriptor<TDocument>, ConstantKeywordProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> ConstantKeyword(PropertyName propertyName, Action<ConstantKeywordPropertyDescriptor<TDocument>> configure) => AssignVariant<ConstantKeywordPropertyDescriptor<TDocument>, ConstantKeywordProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> ConstantKeyword(PropertyName propertyName, ConstantKeywordProperty constantKeywordProperty) => AssignVariant(propertyName, constantKeywordProperty);
		public PropertiesDescriptor<TDocument> ConstantKeyword(Expression<Func<TDocument, object>> propertyName) => AssignVariant<ConstantKeywordPropertyDescriptor<TDocument>, ConstantKeywordProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> ConstantKeyword(Expression<Func<TDocument, object>> propertyName, Action<ConstantKeywordPropertyDescriptor<TDocument>> configure) => AssignVariant<ConstantKeywordPropertyDescriptor<TDocument>, ConstantKeywordProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> DateNanos(PropertyName propertyName) => AssignVariant<DateNanosPropertyDescriptor<TDocument>, DateNanosProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> DateNanos(PropertyName propertyName, Action<DateNanosPropertyDescriptor<TDocument>> configure) => AssignVariant<DateNanosPropertyDescriptor<TDocument>, DateNanosProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> DateNanos(PropertyName propertyName, DateNanosProperty dateNanosProperty) => AssignVariant(propertyName, dateNanosProperty);
		public PropertiesDescriptor<TDocument> DateNanos(Expression<Func<TDocument, object>> propertyName) => AssignVariant<DateNanosPropertyDescriptor<TDocument>, DateNanosProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> DateNanos(Expression<Func<TDocument, object>> propertyName, Action<DateNanosPropertyDescriptor<TDocument>> configure) => AssignVariant<DateNanosPropertyDescriptor<TDocument>, DateNanosProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Date(PropertyName propertyName) => AssignVariant<DatePropertyDescriptor<TDocument>, DateProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Date(PropertyName propertyName, Action<DatePropertyDescriptor<TDocument>> configure) => AssignVariant<DatePropertyDescriptor<TDocument>, DateProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Date(PropertyName propertyName, DateProperty dateProperty) => AssignVariant(propertyName, dateProperty);
		public PropertiesDescriptor<TDocument> Date(Expression<Func<TDocument, object>> propertyName) => AssignVariant<DatePropertyDescriptor<TDocument>, DateProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Date(Expression<Func<TDocument, object>> propertyName, Action<DatePropertyDescriptor<TDocument>> configure) => AssignVariant<DatePropertyDescriptor<TDocument>, DateProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> DateRange(PropertyName propertyName) => AssignVariant<DateRangePropertyDescriptor<TDocument>, DateRangeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> DateRange(PropertyName propertyName, Action<DateRangePropertyDescriptor<TDocument>> configure) => AssignVariant<DateRangePropertyDescriptor<TDocument>, DateRangeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> DateRange(PropertyName propertyName, DateRangeProperty dateRangeProperty) => AssignVariant(propertyName, dateRangeProperty);
		public PropertiesDescriptor<TDocument> DateRange(Expression<Func<TDocument, object>> propertyName) => AssignVariant<DateRangePropertyDescriptor<TDocument>, DateRangeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> DateRange(Expression<Func<TDocument, object>> propertyName, Action<DateRangePropertyDescriptor<TDocument>> configure) => AssignVariant<DateRangePropertyDescriptor<TDocument>, DateRangeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> DenseVector(PropertyName propertyName) => AssignVariant<DenseVectorPropertyDescriptor<TDocument>, DenseVectorProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> DenseVector(PropertyName propertyName, Action<DenseVectorPropertyDescriptor<TDocument>> configure) => AssignVariant<DenseVectorPropertyDescriptor<TDocument>, DenseVectorProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> DenseVector(PropertyName propertyName, DenseVectorProperty denseVectorProperty) => AssignVariant(propertyName, denseVectorProperty);
		public PropertiesDescriptor<TDocument> DenseVector(Expression<Func<TDocument, object>> propertyName) => AssignVariant<DenseVectorPropertyDescriptor<TDocument>, DenseVectorProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> DenseVector(Expression<Func<TDocument, object>> propertyName, Action<DenseVectorPropertyDescriptor<TDocument>> configure) => AssignVariant<DenseVectorPropertyDescriptor<TDocument>, DenseVectorProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> DoubleNumber(PropertyName propertyName) => AssignVariant<DoubleNumberPropertyDescriptor<TDocument>, DoubleNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> DoubleNumber(PropertyName propertyName, Action<DoubleNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<DoubleNumberPropertyDescriptor<TDocument>, DoubleNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> DoubleNumber(PropertyName propertyName, DoubleNumberProperty doubleNumberProperty) => AssignVariant(propertyName, doubleNumberProperty);
		public PropertiesDescriptor<TDocument> DoubleNumber(Expression<Func<TDocument, object>> propertyName) => AssignVariant<DoubleNumberPropertyDescriptor<TDocument>, DoubleNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> DoubleNumber(Expression<Func<TDocument, object>> propertyName, Action<DoubleNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<DoubleNumberPropertyDescriptor<TDocument>, DoubleNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> DoubleRange(PropertyName propertyName) => AssignVariant<DoubleRangePropertyDescriptor<TDocument>, DoubleRangeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> DoubleRange(PropertyName propertyName, Action<DoubleRangePropertyDescriptor<TDocument>> configure) => AssignVariant<DoubleRangePropertyDescriptor<TDocument>, DoubleRangeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> DoubleRange(PropertyName propertyName, DoubleRangeProperty doubleRangeProperty) => AssignVariant(propertyName, doubleRangeProperty);
		public PropertiesDescriptor<TDocument> DoubleRange(Expression<Func<TDocument, object>> propertyName) => AssignVariant<DoubleRangePropertyDescriptor<TDocument>, DoubleRangeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> DoubleRange(Expression<Func<TDocument, object>> propertyName, Action<DoubleRangePropertyDescriptor<TDocument>> configure) => AssignVariant<DoubleRangePropertyDescriptor<TDocument>, DoubleRangeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Dynamic(PropertyName propertyName) => AssignVariant<DynamicPropertyDescriptor<TDocument>, DynamicProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Dynamic(PropertyName propertyName, Action<DynamicPropertyDescriptor<TDocument>> configure) => AssignVariant<DynamicPropertyDescriptor<TDocument>, DynamicProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Dynamic(PropertyName propertyName, DynamicProperty dynamicProperty) => AssignVariant(propertyName, dynamicProperty);
		public PropertiesDescriptor<TDocument> Dynamic(Expression<Func<TDocument, object>> propertyName) => AssignVariant<DynamicPropertyDescriptor<TDocument>, DynamicProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Dynamic(Expression<Func<TDocument, object>> propertyName, Action<DynamicPropertyDescriptor<TDocument>> configure) => AssignVariant<DynamicPropertyDescriptor<TDocument>, DynamicProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> FieldAlias(PropertyName propertyName) => AssignVariant<FieldAliasPropertyDescriptor<TDocument>, FieldAliasProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> FieldAlias(PropertyName propertyName, Action<FieldAliasPropertyDescriptor<TDocument>> configure) => AssignVariant<FieldAliasPropertyDescriptor<TDocument>, FieldAliasProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> FieldAlias(PropertyName propertyName, FieldAliasProperty fieldAliasProperty) => AssignVariant(propertyName, fieldAliasProperty);
		public PropertiesDescriptor<TDocument> FieldAlias(Expression<Func<TDocument, object>> propertyName) => AssignVariant<FieldAliasPropertyDescriptor<TDocument>, FieldAliasProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> FieldAlias(Expression<Func<TDocument, object>> propertyName, Action<FieldAliasPropertyDescriptor<TDocument>> configure) => AssignVariant<FieldAliasPropertyDescriptor<TDocument>, FieldAliasProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Flattened(PropertyName propertyName) => AssignVariant<FlattenedPropertyDescriptor<TDocument>, FlattenedProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Flattened(PropertyName propertyName, Action<FlattenedPropertyDescriptor<TDocument>> configure) => AssignVariant<FlattenedPropertyDescriptor<TDocument>, FlattenedProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Flattened(PropertyName propertyName, FlattenedProperty flattenedProperty) => AssignVariant(propertyName, flattenedProperty);
		public PropertiesDescriptor<TDocument> Flattened(Expression<Func<TDocument, object>> propertyName) => AssignVariant<FlattenedPropertyDescriptor<TDocument>, FlattenedProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Flattened(Expression<Func<TDocument, object>> propertyName, Action<FlattenedPropertyDescriptor<TDocument>> configure) => AssignVariant<FlattenedPropertyDescriptor<TDocument>, FlattenedProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> FloatNumber(PropertyName propertyName) => AssignVariant<FloatNumberPropertyDescriptor<TDocument>, FloatNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> FloatNumber(PropertyName propertyName, Action<FloatNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<FloatNumberPropertyDescriptor<TDocument>, FloatNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> FloatNumber(PropertyName propertyName, FloatNumberProperty floatNumberProperty) => AssignVariant(propertyName, floatNumberProperty);
		public PropertiesDescriptor<TDocument> FloatNumber(Expression<Func<TDocument, object>> propertyName) => AssignVariant<FloatNumberPropertyDescriptor<TDocument>, FloatNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> FloatNumber(Expression<Func<TDocument, object>> propertyName, Action<FloatNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<FloatNumberPropertyDescriptor<TDocument>, FloatNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> FloatRange(PropertyName propertyName) => AssignVariant<FloatRangePropertyDescriptor<TDocument>, FloatRangeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> FloatRange(PropertyName propertyName, Action<FloatRangePropertyDescriptor<TDocument>> configure) => AssignVariant<FloatRangePropertyDescriptor<TDocument>, FloatRangeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> FloatRange(PropertyName propertyName, FloatRangeProperty floatRangeProperty) => AssignVariant(propertyName, floatRangeProperty);
		public PropertiesDescriptor<TDocument> FloatRange(Expression<Func<TDocument, object>> propertyName) => AssignVariant<FloatRangePropertyDescriptor<TDocument>, FloatRangeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> FloatRange(Expression<Func<TDocument, object>> propertyName, Action<FloatRangePropertyDescriptor<TDocument>> configure) => AssignVariant<FloatRangePropertyDescriptor<TDocument>, FloatRangeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> GeoPoint(PropertyName propertyName) => AssignVariant<GeoPointPropertyDescriptor<TDocument>, GeoPointProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> GeoPoint(PropertyName propertyName, Action<GeoPointPropertyDescriptor<TDocument>> configure) => AssignVariant<GeoPointPropertyDescriptor<TDocument>, GeoPointProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> GeoPoint(PropertyName propertyName, GeoPointProperty geoPointProperty) => AssignVariant(propertyName, geoPointProperty);
		public PropertiesDescriptor<TDocument> GeoPoint(Expression<Func<TDocument, object>> propertyName) => AssignVariant<GeoPointPropertyDescriptor<TDocument>, GeoPointProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> GeoPoint(Expression<Func<TDocument, object>> propertyName, Action<GeoPointPropertyDescriptor<TDocument>> configure) => AssignVariant<GeoPointPropertyDescriptor<TDocument>, GeoPointProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> GeoShape(PropertyName propertyName) => AssignVariant<GeoShapePropertyDescriptor<TDocument>, GeoShapeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> GeoShape(PropertyName propertyName, Action<GeoShapePropertyDescriptor<TDocument>> configure) => AssignVariant<GeoShapePropertyDescriptor<TDocument>, GeoShapeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> GeoShape(PropertyName propertyName, GeoShapeProperty geoShapeProperty) => AssignVariant(propertyName, geoShapeProperty);
		public PropertiesDescriptor<TDocument> GeoShape(Expression<Func<TDocument, object>> propertyName) => AssignVariant<GeoShapePropertyDescriptor<TDocument>, GeoShapeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> GeoShape(Expression<Func<TDocument, object>> propertyName, Action<GeoShapePropertyDescriptor<TDocument>> configure) => AssignVariant<GeoShapePropertyDescriptor<TDocument>, GeoShapeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> HalfFloatNumber(PropertyName propertyName) => AssignVariant<HalfFloatNumberPropertyDescriptor<TDocument>, HalfFloatNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> HalfFloatNumber(PropertyName propertyName, Action<HalfFloatNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<HalfFloatNumberPropertyDescriptor<TDocument>, HalfFloatNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> HalfFloatNumber(PropertyName propertyName, HalfFloatNumberProperty halfFloatNumberProperty) => AssignVariant(propertyName, halfFloatNumberProperty);
		public PropertiesDescriptor<TDocument> HalfFloatNumber(Expression<Func<TDocument, object>> propertyName) => AssignVariant<HalfFloatNumberPropertyDescriptor<TDocument>, HalfFloatNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> HalfFloatNumber(Expression<Func<TDocument, object>> propertyName, Action<HalfFloatNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<HalfFloatNumberPropertyDescriptor<TDocument>, HalfFloatNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Histogram(PropertyName propertyName) => AssignVariant<HistogramPropertyDescriptor<TDocument>, HistogramProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Histogram(PropertyName propertyName, Action<HistogramPropertyDescriptor<TDocument>> configure) => AssignVariant<HistogramPropertyDescriptor<TDocument>, HistogramProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Histogram(PropertyName propertyName, HistogramProperty histogramProperty) => AssignVariant(propertyName, histogramProperty);
		public PropertiesDescriptor<TDocument> Histogram(Expression<Func<TDocument, object>> propertyName) => AssignVariant<HistogramPropertyDescriptor<TDocument>, HistogramProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Histogram(Expression<Func<TDocument, object>> propertyName, Action<HistogramPropertyDescriptor<TDocument>> configure) => AssignVariant<HistogramPropertyDescriptor<TDocument>, HistogramProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> IntegerNumber(PropertyName propertyName) => AssignVariant<IntegerNumberPropertyDescriptor<TDocument>, IntegerNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> IntegerNumber(PropertyName propertyName, Action<IntegerNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<IntegerNumberPropertyDescriptor<TDocument>, IntegerNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> IntegerNumber(PropertyName propertyName, IntegerNumberProperty integerNumberProperty) => AssignVariant(propertyName, integerNumberProperty);
		public PropertiesDescriptor<TDocument> IntegerNumber(Expression<Func<TDocument, object>> propertyName) => AssignVariant<IntegerNumberPropertyDescriptor<TDocument>, IntegerNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> IntegerNumber(Expression<Func<TDocument, object>> propertyName, Action<IntegerNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<IntegerNumberPropertyDescriptor<TDocument>, IntegerNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> IntegerRange(PropertyName propertyName) => AssignVariant<IntegerRangePropertyDescriptor<TDocument>, IntegerRangeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> IntegerRange(PropertyName propertyName, Action<IntegerRangePropertyDescriptor<TDocument>> configure) => AssignVariant<IntegerRangePropertyDescriptor<TDocument>, IntegerRangeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> IntegerRange(PropertyName propertyName, IntegerRangeProperty integerRangeProperty) => AssignVariant(propertyName, integerRangeProperty);
		public PropertiesDescriptor<TDocument> IntegerRange(Expression<Func<TDocument, object>> propertyName) => AssignVariant<IntegerRangePropertyDescriptor<TDocument>, IntegerRangeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> IntegerRange(Expression<Func<TDocument, object>> propertyName, Action<IntegerRangePropertyDescriptor<TDocument>> configure) => AssignVariant<IntegerRangePropertyDescriptor<TDocument>, IntegerRangeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Ip(PropertyName propertyName) => AssignVariant<IpPropertyDescriptor<TDocument>, IpProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Ip(PropertyName propertyName, Action<IpPropertyDescriptor<TDocument>> configure) => AssignVariant<IpPropertyDescriptor<TDocument>, IpProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Ip(PropertyName propertyName, IpProperty ipProperty) => AssignVariant(propertyName, ipProperty);
		public PropertiesDescriptor<TDocument> Ip(Expression<Func<TDocument, object>> propertyName) => AssignVariant<IpPropertyDescriptor<TDocument>, IpProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Ip(Expression<Func<TDocument, object>> propertyName, Action<IpPropertyDescriptor<TDocument>> configure) => AssignVariant<IpPropertyDescriptor<TDocument>, IpProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> IpRange(PropertyName propertyName) => AssignVariant<IpRangePropertyDescriptor<TDocument>, IpRangeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> IpRange(PropertyName propertyName, Action<IpRangePropertyDescriptor<TDocument>> configure) => AssignVariant<IpRangePropertyDescriptor<TDocument>, IpRangeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> IpRange(PropertyName propertyName, IpRangeProperty ipRangeProperty) => AssignVariant(propertyName, ipRangeProperty);
		public PropertiesDescriptor<TDocument> IpRange(Expression<Func<TDocument, object>> propertyName) => AssignVariant<IpRangePropertyDescriptor<TDocument>, IpRangeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> IpRange(Expression<Func<TDocument, object>> propertyName, Action<IpRangePropertyDescriptor<TDocument>> configure) => AssignVariant<IpRangePropertyDescriptor<TDocument>, IpRangeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Join(PropertyName propertyName) => AssignVariant<JoinPropertyDescriptor<TDocument>, JoinProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Join(PropertyName propertyName, Action<JoinPropertyDescriptor<TDocument>> configure) => AssignVariant<JoinPropertyDescriptor<TDocument>, JoinProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Join(PropertyName propertyName, JoinProperty joinProperty) => AssignVariant(propertyName, joinProperty);
		public PropertiesDescriptor<TDocument> Join(Expression<Func<TDocument, object>> propertyName) => AssignVariant<JoinPropertyDescriptor<TDocument>, JoinProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Join(Expression<Func<TDocument, object>> propertyName, Action<JoinPropertyDescriptor<TDocument>> configure) => AssignVariant<JoinPropertyDescriptor<TDocument>, JoinProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Keyword(PropertyName propertyName) => AssignVariant<KeywordPropertyDescriptor<TDocument>, KeywordProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Keyword(PropertyName propertyName, Action<KeywordPropertyDescriptor<TDocument>> configure) => AssignVariant<KeywordPropertyDescriptor<TDocument>, KeywordProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Keyword(PropertyName propertyName, KeywordProperty keywordProperty) => AssignVariant(propertyName, keywordProperty);
		public PropertiesDescriptor<TDocument> Keyword(Expression<Func<TDocument, object>> propertyName) => AssignVariant<KeywordPropertyDescriptor<TDocument>, KeywordProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Keyword(Expression<Func<TDocument, object>> propertyName, Action<KeywordPropertyDescriptor<TDocument>> configure) => AssignVariant<KeywordPropertyDescriptor<TDocument>, KeywordProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> LongNumber(PropertyName propertyName) => AssignVariant<LongNumberPropertyDescriptor<TDocument>, LongNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> LongNumber(PropertyName propertyName, Action<LongNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<LongNumberPropertyDescriptor<TDocument>, LongNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> LongNumber(PropertyName propertyName, LongNumberProperty longNumberProperty) => AssignVariant(propertyName, longNumberProperty);
		public PropertiesDescriptor<TDocument> LongNumber(Expression<Func<TDocument, object>> propertyName) => AssignVariant<LongNumberPropertyDescriptor<TDocument>, LongNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> LongNumber(Expression<Func<TDocument, object>> propertyName, Action<LongNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<LongNumberPropertyDescriptor<TDocument>, LongNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> LongRange(PropertyName propertyName) => AssignVariant<LongRangePropertyDescriptor<TDocument>, LongRangeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> LongRange(PropertyName propertyName, Action<LongRangePropertyDescriptor<TDocument>> configure) => AssignVariant<LongRangePropertyDescriptor<TDocument>, LongRangeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> LongRange(PropertyName propertyName, LongRangeProperty longRangeProperty) => AssignVariant(propertyName, longRangeProperty);
		public PropertiesDescriptor<TDocument> LongRange(Expression<Func<TDocument, object>> propertyName) => AssignVariant<LongRangePropertyDescriptor<TDocument>, LongRangeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> LongRange(Expression<Func<TDocument, object>> propertyName, Action<LongRangePropertyDescriptor<TDocument>> configure) => AssignVariant<LongRangePropertyDescriptor<TDocument>, LongRangeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> MatchOnlyText(PropertyName propertyName) => AssignVariant<MatchOnlyTextPropertyDescriptor<TDocument>, MatchOnlyTextProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> MatchOnlyText(PropertyName propertyName, Action<MatchOnlyTextPropertyDescriptor<TDocument>> configure) => AssignVariant<MatchOnlyTextPropertyDescriptor<TDocument>, MatchOnlyTextProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> MatchOnlyText(PropertyName propertyName, MatchOnlyTextProperty matchOnlyTextProperty) => AssignVariant(propertyName, matchOnlyTextProperty);
		public PropertiesDescriptor<TDocument> MatchOnlyText(Expression<Func<TDocument, object>> propertyName) => AssignVariant<MatchOnlyTextPropertyDescriptor<TDocument>, MatchOnlyTextProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> MatchOnlyText(Expression<Func<TDocument, object>> propertyName, Action<MatchOnlyTextPropertyDescriptor<TDocument>> configure) => AssignVariant<MatchOnlyTextPropertyDescriptor<TDocument>, MatchOnlyTextProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Murmur3Hash(PropertyName propertyName) => AssignVariant<Murmur3HashPropertyDescriptor<TDocument>, Murmur3HashProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Murmur3Hash(PropertyName propertyName, Action<Murmur3HashPropertyDescriptor<TDocument>> configure) => AssignVariant<Murmur3HashPropertyDescriptor<TDocument>, Murmur3HashProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Murmur3Hash(PropertyName propertyName, Murmur3HashProperty murmur3HashProperty) => AssignVariant(propertyName, murmur3HashProperty);
		public PropertiesDescriptor<TDocument> Murmur3Hash(Expression<Func<TDocument, object>> propertyName) => AssignVariant<Murmur3HashPropertyDescriptor<TDocument>, Murmur3HashProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Murmur3Hash(Expression<Func<TDocument, object>> propertyName, Action<Murmur3HashPropertyDescriptor<TDocument>> configure) => AssignVariant<Murmur3HashPropertyDescriptor<TDocument>, Murmur3HashProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Nested(PropertyName propertyName) => AssignVariant<NestedPropertyDescriptor<TDocument>, NestedProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Nested(PropertyName propertyName, Action<NestedPropertyDescriptor<TDocument>> configure) => AssignVariant<NestedPropertyDescriptor<TDocument>, NestedProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Nested(PropertyName propertyName, NestedProperty nestedProperty) => AssignVariant(propertyName, nestedProperty);
		public PropertiesDescriptor<TDocument> Nested(Expression<Func<TDocument, object>> propertyName) => AssignVariant<NestedPropertyDescriptor<TDocument>, NestedProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Nested(Expression<Func<TDocument, object>> propertyName, Action<NestedPropertyDescriptor<TDocument>> configure) => AssignVariant<NestedPropertyDescriptor<TDocument>, NestedProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Object(PropertyName propertyName) => AssignVariant<ObjectPropertyDescriptor<TDocument>, ObjectProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Object(PropertyName propertyName, Action<ObjectPropertyDescriptor<TDocument>> configure) => AssignVariant<ObjectPropertyDescriptor<TDocument>, ObjectProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Object(PropertyName propertyName, ObjectProperty objectProperty) => AssignVariant(propertyName, objectProperty);
		public PropertiesDescriptor<TDocument> Object(Expression<Func<TDocument, object>> propertyName) => AssignVariant<ObjectPropertyDescriptor<TDocument>, ObjectProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Object(Expression<Func<TDocument, object>> propertyName, Action<ObjectPropertyDescriptor<TDocument>> configure) => AssignVariant<ObjectPropertyDescriptor<TDocument>, ObjectProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Percolator(PropertyName propertyName) => AssignVariant<PercolatorPropertyDescriptor<TDocument>, PercolatorProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Percolator(PropertyName propertyName, Action<PercolatorPropertyDescriptor<TDocument>> configure) => AssignVariant<PercolatorPropertyDescriptor<TDocument>, PercolatorProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Percolator(PropertyName propertyName, PercolatorProperty percolatorProperty) => AssignVariant(propertyName, percolatorProperty);
		public PropertiesDescriptor<TDocument> Percolator(Expression<Func<TDocument, object>> propertyName) => AssignVariant<PercolatorPropertyDescriptor<TDocument>, PercolatorProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Percolator(Expression<Func<TDocument, object>> propertyName, Action<PercolatorPropertyDescriptor<TDocument>> configure) => AssignVariant<PercolatorPropertyDescriptor<TDocument>, PercolatorProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Point(PropertyName propertyName) => AssignVariant<PointPropertyDescriptor<TDocument>, PointProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Point(PropertyName propertyName, Action<PointPropertyDescriptor<TDocument>> configure) => AssignVariant<PointPropertyDescriptor<TDocument>, PointProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Point(PropertyName propertyName, PointProperty pointProperty) => AssignVariant(propertyName, pointProperty);
		public PropertiesDescriptor<TDocument> Point(Expression<Func<TDocument, object>> propertyName) => AssignVariant<PointPropertyDescriptor<TDocument>, PointProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Point(Expression<Func<TDocument, object>> propertyName, Action<PointPropertyDescriptor<TDocument>> configure) => AssignVariant<PointPropertyDescriptor<TDocument>, PointProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> RankFeature(PropertyName propertyName) => AssignVariant<RankFeaturePropertyDescriptor<TDocument>, RankFeatureProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> RankFeature(PropertyName propertyName, Action<RankFeaturePropertyDescriptor<TDocument>> configure) => AssignVariant<RankFeaturePropertyDescriptor<TDocument>, RankFeatureProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> RankFeature(PropertyName propertyName, RankFeatureProperty rankFeatureProperty) => AssignVariant(propertyName, rankFeatureProperty);
		public PropertiesDescriptor<TDocument> RankFeature(Expression<Func<TDocument, object>> propertyName) => AssignVariant<RankFeaturePropertyDescriptor<TDocument>, RankFeatureProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> RankFeature(Expression<Func<TDocument, object>> propertyName, Action<RankFeaturePropertyDescriptor<TDocument>> configure) => AssignVariant<RankFeaturePropertyDescriptor<TDocument>, RankFeatureProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> RankFeatures(PropertyName propertyName) => AssignVariant<RankFeaturesPropertyDescriptor<TDocument>, RankFeaturesProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> RankFeatures(PropertyName propertyName, Action<RankFeaturesPropertyDescriptor<TDocument>> configure) => AssignVariant<RankFeaturesPropertyDescriptor<TDocument>, RankFeaturesProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> RankFeatures(PropertyName propertyName, RankFeaturesProperty rankFeaturesProperty) => AssignVariant(propertyName, rankFeaturesProperty);
		public PropertiesDescriptor<TDocument> RankFeatures(Expression<Func<TDocument, object>> propertyName) => AssignVariant<RankFeaturesPropertyDescriptor<TDocument>, RankFeaturesProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> RankFeatures(Expression<Func<TDocument, object>> propertyName, Action<RankFeaturesPropertyDescriptor<TDocument>> configure) => AssignVariant<RankFeaturesPropertyDescriptor<TDocument>, RankFeaturesProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> ScaledFloatNumber(PropertyName propertyName) => AssignVariant<ScaledFloatNumberPropertyDescriptor<TDocument>, ScaledFloatNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> ScaledFloatNumber(PropertyName propertyName, Action<ScaledFloatNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<ScaledFloatNumberPropertyDescriptor<TDocument>, ScaledFloatNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> ScaledFloatNumber(PropertyName propertyName, ScaledFloatNumberProperty scaledFloatNumberProperty) => AssignVariant(propertyName, scaledFloatNumberProperty);
		public PropertiesDescriptor<TDocument> ScaledFloatNumber(Expression<Func<TDocument, object>> propertyName) => AssignVariant<ScaledFloatNumberPropertyDescriptor<TDocument>, ScaledFloatNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> ScaledFloatNumber(Expression<Func<TDocument, object>> propertyName, Action<ScaledFloatNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<ScaledFloatNumberPropertyDescriptor<TDocument>, ScaledFloatNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> SearchAsYouType(PropertyName propertyName) => AssignVariant<SearchAsYouTypePropertyDescriptor<TDocument>, SearchAsYouTypeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> SearchAsYouType(PropertyName propertyName, Action<SearchAsYouTypePropertyDescriptor<TDocument>> configure) => AssignVariant<SearchAsYouTypePropertyDescriptor<TDocument>, SearchAsYouTypeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> SearchAsYouType(PropertyName propertyName, SearchAsYouTypeProperty searchAsYouTypeProperty) => AssignVariant(propertyName, searchAsYouTypeProperty);
		public PropertiesDescriptor<TDocument> SearchAsYouType(Expression<Func<TDocument, object>> propertyName) => AssignVariant<SearchAsYouTypePropertyDescriptor<TDocument>, SearchAsYouTypeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> SearchAsYouType(Expression<Func<TDocument, object>> propertyName, Action<SearchAsYouTypePropertyDescriptor<TDocument>> configure) => AssignVariant<SearchAsYouTypePropertyDescriptor<TDocument>, SearchAsYouTypeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Shape(PropertyName propertyName) => AssignVariant<ShapePropertyDescriptor<TDocument>, ShapeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Shape(PropertyName propertyName, Action<ShapePropertyDescriptor<TDocument>> configure) => AssignVariant<ShapePropertyDescriptor<TDocument>, ShapeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Shape(PropertyName propertyName, ShapeProperty shapeProperty) => AssignVariant(propertyName, shapeProperty);
		public PropertiesDescriptor<TDocument> Shape(Expression<Func<TDocument, object>> propertyName) => AssignVariant<ShapePropertyDescriptor<TDocument>, ShapeProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Shape(Expression<Func<TDocument, object>> propertyName, Action<ShapePropertyDescriptor<TDocument>> configure) => AssignVariant<ShapePropertyDescriptor<TDocument>, ShapeProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> ShortNumber(PropertyName propertyName) => AssignVariant<ShortNumberPropertyDescriptor<TDocument>, ShortNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> ShortNumber(PropertyName propertyName, Action<ShortNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<ShortNumberPropertyDescriptor<TDocument>, ShortNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> ShortNumber(PropertyName propertyName, ShortNumberProperty shortNumberProperty) => AssignVariant(propertyName, shortNumberProperty);
		public PropertiesDescriptor<TDocument> ShortNumber(Expression<Func<TDocument, object>> propertyName) => AssignVariant<ShortNumberPropertyDescriptor<TDocument>, ShortNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> ShortNumber(Expression<Func<TDocument, object>> propertyName, Action<ShortNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<ShortNumberPropertyDescriptor<TDocument>, ShortNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Text(PropertyName propertyName) => AssignVariant<TextPropertyDescriptor<TDocument>, TextProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Text(PropertyName propertyName, Action<TextPropertyDescriptor<TDocument>> configure) => AssignVariant<TextPropertyDescriptor<TDocument>, TextProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Text(PropertyName propertyName, TextProperty textProperty) => AssignVariant(propertyName, textProperty);
		public PropertiesDescriptor<TDocument> Text(Expression<Func<TDocument, object>> propertyName) => AssignVariant<TextPropertyDescriptor<TDocument>, TextProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Text(Expression<Func<TDocument, object>> propertyName, Action<TextPropertyDescriptor<TDocument>> configure) => AssignVariant<TextPropertyDescriptor<TDocument>, TextProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> TokenCount(PropertyName propertyName) => AssignVariant<TokenCountPropertyDescriptor<TDocument>, TokenCountProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> TokenCount(PropertyName propertyName, Action<TokenCountPropertyDescriptor<TDocument>> configure) => AssignVariant<TokenCountPropertyDescriptor<TDocument>, TokenCountProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> TokenCount(PropertyName propertyName, TokenCountProperty tokenCountProperty) => AssignVariant(propertyName, tokenCountProperty);
		public PropertiesDescriptor<TDocument> TokenCount(Expression<Func<TDocument, object>> propertyName) => AssignVariant<TokenCountPropertyDescriptor<TDocument>, TokenCountProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> TokenCount(Expression<Func<TDocument, object>> propertyName, Action<TokenCountPropertyDescriptor<TDocument>> configure) => AssignVariant<TokenCountPropertyDescriptor<TDocument>, TokenCountProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> UnsignedLongNumber(PropertyName propertyName) => AssignVariant<UnsignedLongNumberPropertyDescriptor<TDocument>, UnsignedLongNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> UnsignedLongNumber(PropertyName propertyName, Action<UnsignedLongNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<UnsignedLongNumberPropertyDescriptor<TDocument>, UnsignedLongNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> UnsignedLongNumber(PropertyName propertyName, UnsignedLongNumberProperty unsignedLongNumberProperty) => AssignVariant(propertyName, unsignedLongNumberProperty);
		public PropertiesDescriptor<TDocument> UnsignedLongNumber(Expression<Func<TDocument, object>> propertyName) => AssignVariant<UnsignedLongNumberPropertyDescriptor<TDocument>, UnsignedLongNumberProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> UnsignedLongNumber(Expression<Func<TDocument, object>> propertyName, Action<UnsignedLongNumberPropertyDescriptor<TDocument>> configure) => AssignVariant<UnsignedLongNumberPropertyDescriptor<TDocument>, UnsignedLongNumberProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Version(PropertyName propertyName) => AssignVariant<VersionPropertyDescriptor<TDocument>, VersionProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Version(PropertyName propertyName, Action<VersionPropertyDescriptor<TDocument>> configure) => AssignVariant<VersionPropertyDescriptor<TDocument>, VersionProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Version(PropertyName propertyName, VersionProperty versionProperty) => AssignVariant(propertyName, versionProperty);
		public PropertiesDescriptor<TDocument> Version(Expression<Func<TDocument, object>> propertyName) => AssignVariant<VersionPropertyDescriptor<TDocument>, VersionProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Version(Expression<Func<TDocument, object>> propertyName, Action<VersionPropertyDescriptor<TDocument>> configure) => AssignVariant<VersionPropertyDescriptor<TDocument>, VersionProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Wildcard(PropertyName propertyName) => AssignVariant<WildcardPropertyDescriptor<TDocument>, WildcardProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Wildcard(PropertyName propertyName, Action<WildcardPropertyDescriptor<TDocument>> configure) => AssignVariant<WildcardPropertyDescriptor<TDocument>, WildcardProperty>(propertyName, configure);
		public PropertiesDescriptor<TDocument> Wildcard(PropertyName propertyName, WildcardProperty wildcardProperty) => AssignVariant(propertyName, wildcardProperty);
		public PropertiesDescriptor<TDocument> Wildcard(Expression<Func<TDocument, object>> propertyName) => AssignVariant<WildcardPropertyDescriptor<TDocument>, WildcardProperty>(propertyName, null);
		public PropertiesDescriptor<TDocument> Wildcard(Expression<Func<TDocument, object>> propertyName, Action<WildcardPropertyDescriptor<TDocument>> configure) => AssignVariant<WildcardPropertyDescriptor<TDocument>, WildcardProperty>(propertyName, configure);
	}

	internal sealed partial class PropertyInterfaceConverter
	{
		private static IProperty DeserializeVariant(string type, ref Utf8JsonReader reader, JsonSerializerOptions options)
		{
			switch (type)
			{
				case "long_range":
					return JsonSerializer.Deserialize<LongRangeProperty>(ref reader, options);
				case "ip_range":
					return JsonSerializer.Deserialize<IpRangeProperty>(ref reader, options);
				case "integer_range":
					return JsonSerializer.Deserialize<IntegerRangeProperty>(ref reader, options);
				case "float_range":
					return JsonSerializer.Deserialize<FloatRangeProperty>(ref reader, options);
				case "double_range":
					return JsonSerializer.Deserialize<DoubleRangeProperty>(ref reader, options);
				case "date_range":
					return JsonSerializer.Deserialize<DateRangeProperty>(ref reader, options);
				case "unsigned_long":
					return JsonSerializer.Deserialize<UnsignedLongNumberProperty>(ref reader, options);
				case "short":
					return JsonSerializer.Deserialize<ShortNumberProperty>(ref reader, options);
				case "scaled_float":
					return JsonSerializer.Deserialize<ScaledFloatNumberProperty>(ref reader, options);
				case "long":
					return JsonSerializer.Deserialize<LongNumberProperty>(ref reader, options);
				case "integer":
					return JsonSerializer.Deserialize<IntegerNumberProperty>(ref reader, options);
				case "half_float":
					return JsonSerializer.Deserialize<HalfFloatNumberProperty>(ref reader, options);
				case "float":
					return JsonSerializer.Deserialize<FloatNumberProperty>(ref reader, options);
				case "double":
					return JsonSerializer.Deserialize<DoubleNumberProperty>(ref reader, options);
				case "byte":
					return JsonSerializer.Deserialize<ByteNumberProperty>(ref reader, options);
				case "shape":
					return JsonSerializer.Deserialize<ShapeProperty>(ref reader, options);
				case "point":
					return JsonSerializer.Deserialize<PointProperty>(ref reader, options);
				case "geo_shape":
					return JsonSerializer.Deserialize<GeoShapeProperty>(ref reader, options);
				case "geo_point":
					return JsonSerializer.Deserialize<GeoPointProperty>(ref reader, options);
				case "token_count":
					return JsonSerializer.Deserialize<TokenCountProperty>(ref reader, options);
				case "murmur3":
					return JsonSerializer.Deserialize<Murmur3HashProperty>(ref reader, options);
				case "ip":
					return JsonSerializer.Deserialize<IpProperty>(ref reader, options);
				case "histogram":
					return JsonSerializer.Deserialize<HistogramProperty>(ref reader, options);
				case "alias":
					return JsonSerializer.Deserialize<FieldAliasProperty>(ref reader, options);
				case "constant_keyword":
					return JsonSerializer.Deserialize<ConstantKeywordProperty>(ref reader, options);
				case "completion":
					return JsonSerializer.Deserialize<CompletionProperty>(ref reader, options);
				case "object":
					return JsonSerializer.Deserialize<ObjectProperty>(ref reader, options);
				case "nested":
					return JsonSerializer.Deserialize<NestedProperty>(ref reader, options);
				case "flattened":
					return JsonSerializer.Deserialize<FlattenedProperty>(ref reader, options);
				case "dense_vector":
					return JsonSerializer.Deserialize<DenseVectorProperty>(ref reader, options);
				case "aggregate_metric_double":
					return JsonSerializer.Deserialize<AggregateMetricDoubleProperty>(ref reader, options);
				case "date":
					return JsonSerializer.Deserialize<DateProperty>(ref reader, options);
				case "date_nanos":
					return JsonSerializer.Deserialize<DateNanosProperty>(ref reader, options);
				case "wildcard":
					return JsonSerializer.Deserialize<WildcardProperty>(ref reader, options);
				case "version":
					return JsonSerializer.Deserialize<VersionProperty>(ref reader, options);
				case "text":
					return JsonSerializer.Deserialize<TextProperty>(ref reader, options);
				case "search_as_you_type":
					return JsonSerializer.Deserialize<SearchAsYouTypeProperty>(ref reader, options);
				case "rank_features":
					return JsonSerializer.Deserialize<RankFeaturesProperty>(ref reader, options);
				case "rank_feature":
					return JsonSerializer.Deserialize<RankFeatureProperty>(ref reader, options);
				case "percolator":
					return JsonSerializer.Deserialize<PercolatorProperty>(ref reader, options);
				case "match_only_text":
					return JsonSerializer.Deserialize<MatchOnlyTextProperty>(ref reader, options);
				case "keyword":
					return JsonSerializer.Deserialize<KeywordProperty>(ref reader, options);
				case "join":
					return JsonSerializer.Deserialize<JoinProperty>(ref reader, options);
				case "{dynamic_property}":
					return JsonSerializer.Deserialize<DynamicProperty>(ref reader, options);
				case "boolean":
					return JsonSerializer.Deserialize<BooleanProperty>(ref reader, options);
				case "binary":
					return JsonSerializer.Deserialize<BinaryProperty>(ref reader, options);
				default:
					throw new JsonException("Encounted an unknown variant type which could not be deserialised.");
			}
		}
	}

	public partial interface IProperty
	{
		public string Type { get; }
	}
}